<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> 理解js执行上下文和执行栈概念 </title>
</head>
<body>
    
</body>
</html>
<script>
    //2021-06-20-白 
    /**
        *理解javaScript中的执行上下文和执行栈？

        执行上下文？
            是当前JaveScript代码，在被解析和执行所在的抽象环境  
        执行上下文的类型？
            3种类型
            *全局执行上下文 只有1个 浏览器中的全局对象是window对象 this指向的是这个window对象 
            *函数执行上下文 有无数个 只有在函数被调用时猜会被创建 每次调用函数都会创建一个新的执行上下文 
            *Eval执行上下文 指的时运行在eval函数中的代码 很少而且不建议使用 

        执行栈？
            *也叫调用栈 特定(具有lifo后进先出的特点) 用于储存在代码执行期间创建的使用执行上下文
            *首次运行js代码时 会创建一个全局执行上下文并push到当前的执行栈中 
            *每次发生函数调用 引擎都会为该函数创建新的函数执行上下文 并push到当前执行栈的栈顶 
            *根据执行栈的特点 后进先出 当前栈顶函数运行完成后其对应的函数执行上下文将会从执行栈中pop出
            *上下文的控制权 将移到当前执行栈的下一个执行上下文 

        执行上下文的创建？
            *执行上下文分为两个阶段？
            *创建阶段
            *执行阶段 
          创建阶段？
            *1  确定this指向 也被称为This Binding this绑定 
                1.1全局执行上下文中 this指向全局对象 在浏览器中this指向window
                   在node.js中指向这个Module对象
                1.2寒湖是执行上下文this的值取决函数的调用方式 
                    具体默认绑定，隐式绑定，显示绑定，new绑定，箭头函数，   
            *2  词法环境 被创建
                2.1全局环境 
                2.2函数环境
            *3  变量环境 被创建  

    
    */

    function fn(){
        console.log(1)
    }    //函数执行上下文
    fn() //第一次调用时 函数执行完被销毁
    fn() //第二次调用时 会重新创建执行上下文  
         //每一次调用时 他都会创建创建一个新的执行上下文      

    var a = "你好";
    function first() {
        console.log("first")
        console.log(second())
        console.log("again-first")
    }
    function second() {
        console.log('second')
    }
    first()
    console.log('global')


</script>